//
// Created by Administrator on 2024/11/11.
//
// 内容：通过顺序结构 来 完成 队列数据结构
// 1. 确定存储大小
#include "stdio.h"
#define MAXSIZE 1000

// 2. 定义一个队列的结构体
typedef struct {
    // 数组来存储队列数据
    int data[MAXSIZE]; // 存储大小是maxsize
    // 队头指针
    int front;
    // 队尾指针
    int rear;
}SqQueue;

// 3. 初始化队列
void initQueue(SqQueue * queue){
    // 队列的指针 回归到初始值
    queue->rear = queue->front = 0; // 0 初始指针的位置
}

// 4. 判断队列是否为空
int isEmpty(SqQueue * queue){
    return queue->rear == queue->front;
}

// 5. 判断队列是否已满
int isFull(SqQueue * queue){
    return queue->rear == MAXSIZE;
}

// 6. 入队操作
int EnQueue(SqQueue * queue, int value){
    // 6.1. 做一个是否已满的判断
    if (isFull(queue)){
        printf("queue is full");
        return -1;
    }
    // 6.2. 将value插入到 队列的队尾 ==》 rear
    queue->data[queue->rear] = value;
    // 6.3. 让队尾指针 上升一格
    queue->rear++;
    return 0;
}

// 7. 出队操作
int DeQueue(SqQueue * queue){
    // 7.1. 判断一下队列是否为空
    if(isEmpty(queue)){
        printf("queue is empty, could not dequeue");
        return -1;
    }
    // 7.2. 正常出队
//    int value = queue->data[queue->front];
//    queue->front++;
//    return value;
    return queue->data[queue->front++];
}

// 8. 获取队头的数据
int getFront(SqQueue * queue){
    if(isEmpty(queue)){
        return -1;
    }
    return queue->data[queue->front];
}

// 9. 遍历队列中所有的元素
void printQueue(SqQueue * queue){
    if(isEmpty(queue)){
        return;
    }
    for(int i=queue->front; i<queue->rear; i++){
        printf("%d ", queue->data[i]);
    }
    printf("\n");
}

// 创建队列
int main(void){
    SqQueue queue;
    initQueue(&queue);

    EnQueue(&queue, 10);
    EnQueue(&queue, 20);
    EnQueue(&queue, 30);

    printf("%d\n", DeQueue(&queue));
    printf("%d\n", DeQueue(&queue));
    printf("%d\n", DeQueue(&queue));

    EnQueue(&queue, 10);
    EnQueue(&queue, 20);
    EnQueue(&queue, 30);

    printQueue(&queue);

}